package com.zenithmind.library.service;

import com.zenithmind.common.result.PageResult;
import com.zenithmind.common.result.Result;
import com.zenithmind.library.pojo.dto.BookCopyCreateDTO;
import com.zenithmind.library.pojo.dto.BookCopyUpdateDTO;
import com.zenithmind.library.pojo.query.BookCopyQuery;
import com.zenithmind.library.pojo.vo.BookCopyVO;

import java.util.List;

/**
 * 图书副本服务接口
 * 遵循接口隔离原则：只包含图书副本相关的业务方法
 * 
 * @author ZenithMind
 * @since 2024-06-14
 */
public interface BookCopyService {

    /**
     * 分页查询图书副本
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BookCopyVO> getBookCopyPage(BookCopyQuery query);

    /**
     * 根据ID查询图书副本详情
     * 
     * @param id 图书副本ID
     * @return 图书副本详情
     */
    Result<BookCopyVO> getBookCopyById(String id);

    /**
     * 根据图书ID查询所有副本
     * 
     * @param bookId 图书ID
     * @return 图书副本列表
     */
    Result<List<BookCopyVO>> getBookCopiesByBookId(String bookId);

    /**
     * 根据条形码查询图书副本
     * 
     * @param barcode 条形码
     * @return 图书副本详情
     */
    Result<BookCopyVO> getBookCopyByBarcode(String barcode);

    /**
     * 创建图书副本
     * 
     * @param createDTO 创建参数
     * @return 创建结果
     */
    Result<BookCopyVO> createBookCopy(BookCopyCreateDTO createDTO);

    /**
     * 批量创建图书副本
     * 
     * @param bookId 图书ID
     * @param quantity 数量
     * @return 创建结果
     */
    Result<List<BookCopyVO>> batchCreateBookCopies(String bookId, Integer quantity);

    /**
     * 更新图书副本
     * 
     * @param id 图书副本ID
     * @param updateDTO 更新参数
     * @return 更新结果
     */
    Result<BookCopyVO> updateBookCopy(String id, BookCopyUpdateDTO updateDTO);

    /**
     * 删除图书副本
     * 
     * @param id 图书副本ID
     * @return 删除结果
     */
    Result<Void> deleteBookCopy(String id);

    /**
     * 批量删除图书副本
     * 
     * @param ids 图书副本ID列表
     * @return 删除结果
     */
    Result<Void> batchDeleteBookCopies(List<String> ids);

    /**
     * 更新图书副本状态
     * 
     * @param id 图书副本ID
     * @param status 状态
     * @return 更新结果
     */
    Result<Void> updateBookCopyStatus(String id, Integer status);

    /**
     * 更新图书副本位置
     * 
     * @param id 图书副本ID
     * @param location 位置
     * @return 更新结果
     */
    Result<Void> updateBookCopyLocation(String id, String location);

    /**
     * 检查条形码是否存在
     * 
     * @param barcode 条形码
     * @param excludeId 排除的ID
     * @return 是否存在
     */
    boolean existsByBarcode(String barcode, String excludeId);

    /**
     * 获取图书副本统计信息
     * 
     * @param bookId 图书ID
     * @return 统计信息
     */
    Result<BookCopyStatisticsVO> getBookCopyStatistics(String bookId);

    /**
     * 导入图书副本数据
     * 
     * @param bookCopies 图书副本列表
     * @return 导入结果
     */
    Result<String> importBookCopies(List<BookCopyCreateDTO> bookCopies);

    /**
     * 导出图书副本数据
     * 
     * @param query 查询条件
     * @return 导出结果
     */
    Result<String> exportBookCopies(BookCopyQuery query);

    /**
     * 图书副本统计VO
     */
    class BookCopyStatisticsVO {
        private Integer totalCopies;
        private Integer availableCopies;
        private Integer borrowedCopies;
        private Integer reservedCopies;
        private Integer damagedCopies;
        private Integer lostCopies;

        // getters and setters
        public Integer getTotalCopies() { return totalCopies; }
        public void setTotalCopies(Integer totalCopies) { this.totalCopies = totalCopies; }
        
        public Integer getAvailableCopies() { return availableCopies; }
        public void setAvailableCopies(Integer availableCopies) { this.availableCopies = availableCopies; }
        
        public Integer getBorrowedCopies() { return borrowedCopies; }
        public void setBorrowedCopies(Integer borrowedCopies) { this.borrowedCopies = borrowedCopies; }
        
        public Integer getReservedCopies() { return reservedCopies; }
        public void setReservedCopies(Integer reservedCopies) { this.reservedCopies = reservedCopies; }
        
        public Integer getDamagedCopies() { return damagedCopies; }
        public void setDamagedCopies(Integer damagedCopies) { this.damagedCopies = damagedCopies; }
        
        public Integer getLostCopies() { return lostCopies; }
        public void setLostCopies(Integer lostCopies) { this.lostCopies = lostCopies; }
    }
}
